package controller;

import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

import util.Comandos;
import util.FunctionsUtils;
import view.CorporalFrame;
import view.PrincipalFrame;

/**
 * Controlador del Frame CorporalFrame
 * 
 * @author ariel
 * 
 */
public class CorporalController implements ActionListener {

	private CorporalFrame vista;

	public CorporalController(PrincipalFrame principal) {
		this.vista = new CorporalFrame(principal);
		inicializar();
	}

	public void inicializar() {
		vista.setTitle("CorporalFrame");
		vista.getContentPane().setPreferredSize(vista.getSize());
		vista.pack();
		vista.setLocationRelativeTo(null);
		vista.setVisible(true);
		vista.setActionListeners(this);
	}

	public void actionPerformed(ActionEvent e) {
		String comando = e.getActionCommand();
		switch (Comandos.valueOf(comando)) {

		case CAPTURA:
			try {
				Toolkit tool = Toolkit.getDefaultToolkit();
				Dimension d = tool.getScreenSize();
				Rectangle rect = new Rectangle(d);
				Robot robot = new Robot();
				Thread.sleep(2000);
				File f = new File("screenshot.jpg");
				BufferedImage img = robot.createScreenCapture(rect);
				ImageIO.write(img, "jpeg", f);
				tool.beep();
			} catch (Exception e1) {
				e1.printStackTrace();
			}

			break;

		case CALCULAR_CORPORAL:
			float munieca = Float.parseFloat(vista.getMunieca());
			float peso = Float.parseFloat(vista.getPeso());
			float altura = Float.parseFloat(vista.getAltura());

			int edad = Integer.parseInt(vista.getEdad());

			String sexo = vista.getSexo();
			float valorTabla = getValorTabla(munieca, altura);
			float porcentaje = 0;

			if (sexo.equals("hombre")) {
				porcentaje = 115 + valorTabla + peso - altura;
			}
			if (sexo.equals("mujer")) {
				porcentaje = 125 + valorTabla + peso - altura;
			}

			float masaA = porcentaje / 100;
			float masaM = peso - masaA;

			Double porcentajeGraso = FunctionsUtils.redondear(porcentaje, 2);

			vista.setPorcetajeGraso(String.valueOf(porcentajeGraso));
			vista.setMasaAdiposa(String.valueOf(FunctionsUtils.redondear(masaA,
					2)));
			vista.setMasaMagra(String.valueOf(FunctionsUtils
					.redondear(masaM, 2)));

			String tipoPersona = getTipoPersona(sexo, edad, porcentajeGraso);
			vista.setTipoPersona(tipoPersona);

			break;
		}
	}

	private String getTipoPersona(String sexo, int edad, Double porcentajeGraso) {
		String mensaje = "";

		if (sexo.equals("hombre")) {
			if ((edad > 16) && (edad < 20)) {
				if (porcentajeGraso <= 6) {
					mensaje = "Persona muy delgada";
				}
				if ((porcentajeGraso >= 7) && (porcentajeGraso <= 11)) {
					mensaje = "Persona delgada";
				}
				if ((porcentajeGraso >= 12) && (porcentajeGraso <= 17)) {
					mensaje = "Persona peso medio";
				}
				if ((porcentajeGraso >= 18) && (porcentajeGraso <= 22)) {
					mensaje = "Persona casi en su peso";
				}
				if ((porcentajeGraso >= 23) && (porcentajeGraso <= 29)) {
					mensaje = "Persona en su peso";
				}
				if (porcentajeGraso >= 30) {
					mensaje = "Persona obesa";
				}
			}
			if ((edad > 19) && (edad < 30)) {
				if (porcentajeGraso <= 8) {
					mensaje = "Persona muy delgada";
				}
				if ((porcentajeGraso >= 9) && (porcentajeGraso <= 14)) {
					mensaje = "Persona delgada";
				}
				if ((porcentajeGraso >= 15) && (porcentajeGraso <= 19)) {
					mensaje = "Persona peso medio";
				}
				if ((porcentajeGraso >= 20) && (porcentajeGraso <= 24)) {
					mensaje = "Persona casi en su peso";
				}
				if ((porcentajeGraso >= 25) && (porcentajeGraso <= 31)) {
					mensaje = "Persona en su peso";
				}
				if (porcentajeGraso >= 32) {
					mensaje = "Persona obesa";
				}
			}
			if ((edad > 29) && (edad < 40)) {
				if (porcentajeGraso <= 14) {
					mensaje = "Persona muy delgada";
				}
				if ((porcentajeGraso >= 15) && (porcentajeGraso <= 18)) {
					mensaje = "Persona delgada";
				}
				if ((porcentajeGraso >= 19) && (porcentajeGraso <= 22)) {
					mensaje = "Persona peso medio";
				}
				if ((porcentajeGraso >= 23) && (porcentajeGraso <= 26)) {
					mensaje = "Persona casi en su peso";
				}
				if ((porcentajeGraso >= 27) && (porcentajeGraso <= 33)) {
					mensaje = "Persona en su peso";
				}
				if (porcentajeGraso >= 34) {
					mensaje = "Persona obesa";
				}
			}
			if ((edad > 39) && (edad < 50)) {
				if (porcentajeGraso <= 15) {
					mensaje = "Persona muy delgada";
				}
				if ((porcentajeGraso >= 16) && (porcentajeGraso <= 21)) {
					mensaje = "Persona delgada";
				}
				if ((porcentajeGraso >= 22) && (porcentajeGraso <= 26)) {
					mensaje = "Persona peso medio";
				}
				if ((porcentajeGraso >= 27) && (porcentajeGraso <= 31)) {
					mensaje = "Persona casi en su peso";
				}
				if ((porcentajeGraso >= 32) && (porcentajeGraso <= 34)) {
					mensaje = "Persona en su peso";
				}
				if (porcentajeGraso >= 35) {
					mensaje = "Persona obesa";
				}
			}
			if ((edad > 49) && (edad < 60)) {
				if (porcentajeGraso <= 16) {
					mensaje = "Persona muy delgada";
				}
				if ((porcentajeGraso >= 17) && (porcentajeGraso <= 22)) {
					mensaje = "Persona delgada";
				}
				if ((porcentajeGraso >= 23) && (porcentajeGraso <= 28)) {
					mensaje = "Persona peso medio";
				}
				if ((porcentajeGraso >= 29) && (porcentajeGraso <= 34)) {
					mensaje = "Persona casi en su peso";
				}
				if ((porcentajeGraso >= 35) && (porcentajeGraso <= 37)) {
					mensaje = "Persona en su peso";
				}
				if (porcentajeGraso >= 38) {
					mensaje = "Persona obesa";
				}
			}
			if (edad > 59) {
				if (porcentajeGraso <= 17) {
					mensaje = "Persona muy delgada";
				}
				if ((porcentajeGraso >= 18) && (porcentajeGraso <= 23)) {
					mensaje = "Persona delgada";
				}
				if ((porcentajeGraso >= 24) && (porcentajeGraso <= 30)) {
					mensaje = "Persona peso medio";
				}
				if ((porcentajeGraso >= 31) && (porcentajeGraso <= 36)) {
					mensaje = "Persona casi en su peso";
				}
				if ((porcentajeGraso >= 37) && (porcentajeGraso <= 40)) {
					mensaje = "Persona en su peso";
				}
				if (porcentajeGraso >= 41) {
					mensaje = "Persona obesa";
				}
			}
		}
		if (sexo.equals("mujer")) {
			if ((edad > 16) && (edad < 20)) {
				if (porcentajeGraso <= 13) {
					mensaje = "Persona muy delgada";
				}
				if ((porcentajeGraso >= 14) && (porcentajeGraso <= 18)) {
					mensaje = "Persona delgada";
				}
				if ((porcentajeGraso >= 19) && (porcentajeGraso <= 23)) {
					mensaje = "Persona peso medio";
				}
				if ((porcentajeGraso >= 24) && (porcentajeGraso <= 28)) {
					mensaje = "Persona casi en su peso";
				}
				if ((porcentajeGraso >= 29) && (porcentajeGraso <= 34)) {
					mensaje = "Persona en su peso";
				}
				if (porcentajeGraso >= 35) {
					mensaje = "Persona obesa";
				}
			}
			if ((edad > 19) && (edad < 30)) {
				if (porcentajeGraso <= 13) {
					mensaje = "Persona muy delgada";
				}
				if ((porcentajeGraso >= 14) && (porcentajeGraso <= 18)) {
					mensaje = "Persona delgada";
				}
				if ((porcentajeGraso >= 19) && (porcentajeGraso <= 23)) {
					mensaje = "Persona peso medio";
				}
				if ((porcentajeGraso >= 24) && (porcentajeGraso <= 28)) {
					mensaje = "Persona casi en su peso";
				}
				if ((porcentajeGraso >= 29) && (porcentajeGraso <= 34)) {
					mensaje = "Persona en su peso";
				}
				if (porcentajeGraso >= 35) {
					mensaje = "Persona obesa";
				}
			}
			if ((edad > 29) && (edad < 40)) {
				if (porcentajeGraso <= 14) {
					mensaje = "Persona muy delgada";
				}
				if ((porcentajeGraso >= 15) && (porcentajeGraso <= 19)) {
					mensaje = "Persona delgada";
				}
				if ((porcentajeGraso >= 20) && (porcentajeGraso <= 24)) {
					mensaje = "Persona peso medio";
				}
				if ((porcentajeGraso >= 25) && (porcentajeGraso <= 29)) {
					mensaje = "Persona casi en su peso";
				}
				if ((porcentajeGraso >= 30) && (porcentajeGraso <= 36)) {
					mensaje = "Persona en su peso";
				}
				if (porcentajeGraso >= 37) {
					mensaje = "Persona obesa";
				}
			}
			if ((edad > 39) && (edad < 50)) {
				if (porcentajeGraso <= 15) {
					mensaje = "Persona muy delgada";
				}
				if ((porcentajeGraso >= 16) && (porcentajeGraso <= 21)) {
					mensaje = "Persona delgada";
				}
				if ((porcentajeGraso >= 22) && (porcentajeGraso <= 26)) {
					mensaje = "Persona peso medio";
				}
				if ((porcentajeGraso >= 27) && (porcentajeGraso <= 31)) {
					mensaje = "Persona casi en su peso";
				}
				if ((porcentajeGraso >= 32) && (porcentajeGraso <= 34)) {
					mensaje = "Persona en su peso";
				}
				if (porcentajeGraso >= 35) {
					mensaje = "Persona obesa";
				}
			}
			if ((edad > 49) && (edad < 60)) {
				if (porcentajeGraso <= 16) {
					mensaje = "Persona muy delgada";
				}
				if ((porcentajeGraso >= 17) && (porcentajeGraso <= 22)) {
					mensaje = "Persona delgada";
				}
				if ((porcentajeGraso >= 23) && (porcentajeGraso <= 28)) {
					mensaje = "Persona peso medio";
				}
				if ((porcentajeGraso >= 29) && (porcentajeGraso <= 34)) {
					mensaje = "Persona casi en su peso";
				}
				if ((porcentajeGraso >= 35) && (porcentajeGraso <= 37)) {
					mensaje = "Persona en su peso";
				}
				if (porcentajeGraso >= 38) {
					mensaje = "Persona obesa";
				}
			}
			if (edad > 59) {
				if (porcentajeGraso <= 17) {
					mensaje = "Persona muy delgada";
				}
				if ((porcentajeGraso >= 18) && (porcentajeGraso <= 23)) {
					mensaje = "Persona delgada";
				}
				if ((porcentajeGraso >= 24) && (porcentajeGraso <= 30)) {
					mensaje = "Persona peso medio";
				}
				if ((porcentajeGraso >= 31) && (porcentajeGraso <= 36)) {
					mensaje = "Persona casi en su peso";
				}
				if ((porcentajeGraso >= 37) && (porcentajeGraso <= 40)) {
					mensaje = "Persona en su peso";
				}
				if (porcentajeGraso >= 41) {
					mensaje = "Persona obesa";
				}
			}
		}
		return mensaje;
	}

	private float getValorTabla(float munieca, float alt) {
		if (munieca == 10) {
			return 4;
		}
		if (munieca == 11) {
			if (alt <= 150) {
				return (float) 3.5;
			} else
				return 4;
		}
		if (munieca == 12) {
			if (alt <= 150) {
				return 3;
			}
			if (alt > 151 && alt < 161) {
				return (float) 3.5;
			} else
				return 4;
		}
		if (munieca == 13) {
			if (alt <= 150) {
				return (float) 2.5;
			}
			if (alt > 150 && alt < 161) {
				return (float) 3;
			}
			if (alt > 160 && alt < 171) {
				return (float) 3.5;
			} else
				return 4;
		}
		if (munieca == 14) {
			if (alt <= 150) {
				return (float) 2;
			}
			if (alt > 150 && alt < 161) {
				return (float) 2.5;
			}
			if (alt > 160 && alt < 171) {
				return (float) 3;
			}
			if (alt > 170 && alt < 181) {
				return (float) 3.5;
			} else
				return 4;
		}
		if (munieca == 15) {
			if (alt <= 150) {
				return (float) 1.5;
			}
			if (alt > 150 && alt < 161) {
				return (float) 2;
			}
			if (alt > 160 && alt < 171) {
				return (float) 2.5;
			}
			if (alt > 170 && alt < 181) {
				return (float) 3;
			}
			if (alt > 180) {
				return (float) 3.5;
			}
		}
		if (munieca == 16) {
			if (alt <= 150) {
				return (float) 1;
			}
			if (alt > 150 && alt < 161) {
				return (float) 1.5;
			}
			if (alt > 160 && alt < 171) {
				return (float) 2;
			}
			if (alt > 170 && alt < 181) {
				return (float) 2.5;
			}
			if (alt > 180) {
				return (float) 3;
			}
		}
		if (munieca == 17) {
			if (alt <= 150) {
				return (float) 0.5;
			}
			if (alt > 150 && alt < 161) {
				return (float) 1;
			}
			if (alt > 160 && alt < 171) {
				return (float) 1.5;
			}
			if (alt > 170 && alt < 181) {
				return (float) 2;
			}
			if (alt > 180) {
				return (float) 2.5;
			}
		}
		if (munieca == 18) {
			if (alt <= 150) {
				return (float) 0;
			}
			if (alt > 150 && alt < 161) {
				return (float) 0.5;
			}
			if (alt > 160 && alt < 171) {
				return (float) 1;
			}
			if (alt > 170 && alt < 181) {
				return (float) 1.5;
			}
			if (alt > 180) {
				return (float) 2;
			}
		}
		if (munieca == 19) {
			if (alt > 180) {
				return (float) 1.5;
			}
			if (alt > 170 && alt < 181) {
				return (float) 1;
			}
			if (alt > 160 && alt < 171) {
				return (float) 0.5;
			} else
				return 0;
		}
		if (munieca == 20) {
			if (alt > 180) {
				return (float) 1;
			}
			if (alt > 170 && alt < 181) {
				return (float) 0.5;
			} else
				return 0;
		}
		if (munieca == 21) {
			if (alt > 180) {
				return (float) 0.5;
			} else
				return 0;
		}
		return 0;
	}

}
